package com.csdn.springbootmybatis.filter;

import com.csdn.springbootmybatis.mode.Account;
import com.csdn.springbootmybatis.mode.Permission;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @ 用户权限管理
 */
@Component
@WebFilter(urlPatterns = "/*")   //拦截过滤哪些URL
@Slf4j
public class AccountFilter implements Filter {


    // 不需要登录的 URI
    private final String[] IGNORE_URI = {

            "/index","/account/validataAccount","/css/","/js/","/account/login","/images","/errorPage"};


    /**
     * 判断登录没有，无非就是看看session里有没有值即可
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {


        HttpServletRequest request =  (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;

        String uri = request.getRequestURI();

        // 当前访问的URI是不是 在Ignore列表里
//        System.out.println("uri:" + uri);
        log.info("uri={}",uri);
        boolean pass = canPassIgnore(uri);
        if (pass) {
            // 在的话 放行（类似于springmvc拦截器里面的 return true）
            chain.doFilter(request, response);

            //从业务逻辑中，看的出这个基础知识。  这里要return结束方法，否则就算doFilter放行了，方法还是会往下走的
            return;
        }

        // 是否已登录，从session里找 Account

        Account account = (Account) request.getSession().getAttribute("account");
        System.out.println("getSession account:" + account);
        if (null == account) {
            // 没登录 跳转登录页面    用response跳  这是浏览器跳转302。  重定向？
            response.sendRedirect("/account/login");
            return;
        }

        // 已登陆用户是否有权限访问当前页面
        /*if(!hashauth(account.getPermissionList(),uri)){
            request.setAttribute("msg","您无权访问当前页面" + uri);
            request.getRequestDispatcher("/errorPage").forward(request,response);   //而这个是在服务器段跳转。  url是不变的
            return;
        }*/


        System.out.println("----filter----" + uri);
        //登录了 就直接放行
        chain.doFilter(request, response);

    }

    private boolean hashauth(List<Permission> permissionList,String uri) {
        for (Permission permission : permissionList) {

            if(uri.startsWith(permission.getUri())){
                return true;
            }
        }
        return false;
    }

    private boolean canPassIgnore(String uri) {

        // /index = uri

        // 判断 访问的URI 起始部分 是否包含 Ignore
        // 下级目录资源也能访问

        for (String val : IGNORE_URI) {

            if(uri.startsWith(val)) {
                return true;
            };
        }

        return false;
    }

    @Override
    public void destroy() {

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

        // 加载 Filter 启动之前需要的资源
        System.out.println("---------------AccountFilter Init....");

//        Filter.super.init(filterConfig);
    }



}
